package com.gkzf.ai.module.crm.util;

import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.stream.Collectors;

@Slf4j
public class IdNumberUtils {

    /**
     * 对18位身份证号码进行打码，默认保留前6位和后4位。
     *
     * @param idCard 18位身份证号码
     * @return 打码后的身份证号码，如果输入非法则返回null或空字符串（根据实际需求调整）
     */
    public static int redactIdCard(String idCard) {
        // 默认保留前6位和后4位
        return isValid(idCard);
    }

    public static int isValid(String idCard) {
        // 长度校验
        if (idCard == null || (idCard.length() != 18 && idCard.length() != 15)) {
            return 1;
        }

        // 出生日期校验
        String birthDateStr = idCard.length() == 18 ? idCard.substring(6, 14) : "19" + idCard.substring(6, 12);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        dateFormat.setLenient(false);  // 严格校验
        try {
            dateFormat.parse(birthDateStr);  // 检查日期是否有效
        } catch (ParseException e) {
            return 2;
        }

        // 校验码校验 (如果是18位身份证)
        if (idCard.length() == 18 && !isValidChecksum(idCard)) {
            return 2;
        }

        return 0;
    }

    // 校验身份证的第18位校验码
    private static boolean isValidChecksum(String idCard) {
        // 校验位的权重因子
        int[] weights = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        // 校验码
        char[] checkCode = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

        // 计算校验和
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            sum += (idCard.charAt(i) - '0') * weights[i];
        }
        int mod = sum % 11;

        // 校验
        return idCard.charAt(17) == checkCode[mod];
    }

    /**
     * 对18位身份证号码进行打码，可指定保留前后位数。
     *
     * @param idCard       18位身份证号码
     * @param prefixLength 保留前多少位
     * @param suffixLength 保留后多少位
     * @return 1是异常  0正常
     */
    public static int redactIdCard(String idCard, int prefixLength, int suffixLength) {
        if (idCard == null || idCard.length() != 18) {
            // 或者返回 null, "", 或者抛出更具体的异常
            return 1;
        }

        if (prefixLength < 0 || suffixLength < 0) {
            return 1;
        }

        int totalLength = idCard.length();
        int preservedLength = prefixLength + suffixLength;

        if (preservedLength > totalLength) {
            return 1;
        }

        int redactedLength = totalLength - preservedLength;

        if (redactedLength <= 0) {
            // 如果不需要打码（保留位数 >= 总长度），返回原字符串
            return 0;
        }

        // 获取前缀
        String prefix = idCard.substring(0, prefixLength);

        // 获取后缀
        String suffix = idCard.substring(totalLength - suffixLength);

        // 生成中间的星号字符串
        // Java 11+ 可以使用 "*".repeat(redactedLength)
        // Java 8 可以使用 Collectors.joining 或 Collections.nCopies
        String redactedPart = Collections.nCopies(redactedLength, "*").stream().collect(Collectors.joining());

        // 拼接并返回
        return 0;
    }

}
